プラットフォーム チャネル テスト インターフェイスの flutter_test パッケージへの移行
まとめ
次のメソッドは API に置き換えられました
の中にflutter_test
パッケージ:
BinaryMessenger.checkMessageHandler
BinaryMessenger.setMockMessageHandler
BinaryMessenger.checkMockMessageHandler
BasicMessageChannel.setMockMessageHandler
MethodChannel.checkMethodCallHandler
MethodChannel.setMockMethodCallHandler
MethodChannel.checkMockMethodCallHandler
のonPlatformMessage
コールバックは使用されなくなりました
Flutter フレームワークによる。
コンテクスト
低レベルプラグインのリファクタリングの一環として
通信アーキテクチャから移行しました。
前onPlatformMessage
/handlePlatformMessage
に実装されたチャネルごとのバッファリング システムへのロジック
のエンジンChannelBuffers
クラス。
既存のコードとの互換性を維持するには、
既存のBinaryMessenger.setMessageHandler
API
新しいものを使用するようにリファクタリングされましたChannelBuffers
API。
1つの違いは、ChannelBuffers
APIと
以前の API は、新しい API の方がより一貫性があります。
非同期性へのアプローチ。副作用として、
メッセージパッシング関連の API は完全に非同期になりました。
これにより、レガシーの実装に問題が生じました。
API をテストすることは、歴史的な理由により、
以前はflutter
パッケージ。
これらは基礎となるロジックが部分的に同期していることに依存しているため、
リファクタリングが必要でした。
さらに多くのテスト ロジックを追加しないようにするため、flutter
パッケージ、
このロジックをflutter_test
パッケージ。
変更内容の説明
具体的には、次の API が影響を受けました。
-
BinaryMessenger.checkMessageHandler
: 廃止。 -
BinaryMessenger.setMockMessageHandler
: と取り換えるTestDefaultBinaryMessenger.setMockMessageHandler
。 -
BinaryMessenger.checkMockMessageHandler
: 交換済み にTestDefaultBinaryMessenger.checkMockMessageHandler
。 -
BasicMessageChannel.setMockMessageHandler
: 交換済み にTestDefaultBinaryMessenger.setMockDecodedMessageHandler
。 -
MethodChannel.checkMethodCallHandler
: 廃止。 -
MethodChannel.setMockMethodCallHandler
: と取り換えるTestDefaultBinaryMessenger.setMockMethodCallHandler
。 -
MethodChannel.checkMockMethodCallHandler
: 交換済み にTestDefaultBinaryMessenger.checkMockMessageHandler
。
これらの置換は、
新しいTestDefaultBinaryMessengerBinding
(使用するコードなど)testWidgets
でflutter_test
テスト)。
使用していた製品コードに代わるものはありません
これらの API は実稼働コードでの使用を目的としていないためです。
を使用したテストcheckMessageHandler
に相当するものはありません
メッセージ ハンドラーの登録が処理されるため、新しい API
直接的にChannelBuffers
そうでないオブジェクト
現在登録されているチャンネルのリスナーを公開します。
(ハンドラーの登録を検証するテストはまれであるようです。)
移行が必要なコードでは、次のようなエラーが表示される場合があります。
error - The method 'setMockMessageHandler' isn't defined for the type 'BinaryMessenger' at test/sensors_test.dart:64:8 - (undefined_method)
error • The method 'setMockMethodCallHandler' isn't defined for the type 'MethodChannel' • test/widgets/editable_text_test.dart:5623:30 • undefined_method
[error] The method 'setMockMessageHandler' isn't defined for the type 'BasicMessageChannel' (test/material/feedback_test.dart:37:36)
加えてonPlatformMessage
折り返し電話、
以前はフレームワークによってフックされていました
プラグインからメッセージを受信します。現在は使用されていません
(そしてやがて削除されます)。結果として、
このコールバックを呼び出してメッセージを
フレームワークはもう効果がありません。
移行ガイド
のflutter_test
パッケージにはいくつかのシムが含まれているため、
時代遅れの用途setMock...
とcheckMock...
メソッドは引き続き機能します。
以前にインポートされなかったテストpackage:flutter_test/flutter_test.dart
できる
これらの shim を有効にするには、これを実行します。
ほとんどのコードを移行するにはこれで十分です。
ただし、これらの shim API は非推奨です。その代わり、
コード内で使用WidgetTester
(たとえば、testWidgets
)、
次のパターンを使用することをお勧めします。
それらのメソッドの呼び出しを置き換えます
(どこtester
それはWidgetTester
実例):
// old code
ServicesBinding.defaultBinaryMessenger.setMockMessageHandler(...);
ServicesBinding.defaultBinaryMessenger.checkMockMessageHandler(...);
// new code
tester.binding.defaultBinaryMessenger.setMockMessageHandler(...);
tester.binding.defaultBinaryMessenger.checkMockMessageHandler(...);
// old code
myChannel.setMockMessageHandler(...);
myChannel.checkMockMessageHandler(...);
// new code
tester.binding.defaultBinaryMessenger.setMockDecodedMessageHandler(myChannel, ...);
tester.binding.defaultBinaryMessenger.checkMockMessageHandler(myChannel, ...);
// old code
myMethodChannel.setMockMethodCallHandler(...);
myMethodChannel.checkMockMethodCallHandler(...);
// new code
tester.binding.defaultBinaryMessenger.setMockMethodCallHandler(myMethodChannel, ...);
tester.binding.defaultBinaryMessenger.checkMockMessageHandler(myMethodChannel, ...);
を使用するテストpackage:test
とtest()
使用するように変更できますpackage:flutter_test
とtestWidgets()
にアクセスするにはWidgetTester
。
にアクセスできないコードWidgetTester
参照できるTestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger
それ以外のtester.binding.defaultBinaryMessenger
。
デフォルトのテスト ウィジェット バインディングを使用しないテスト
(AutomatedTestWidgetsFlutterBinding
、
によって初期化されますtestWidgets
)を混合することができますTestDefaultBinaryMessengerBinding
彼らの中に混ぜる
同じ結果を得るためにバインディングします。
操作するテストonPlatformMessage
もうしないだろう
設計どおりに機能します。モックメッセージをフレームワークに送信するには、
使用を検討してくださいChannelBuffers.push
。
プラグインからのメッセージを傍受するメカニズムはありません
そしてそれらを新しい API のフレームワークに転送します。
あなたのユースケースでそのようなメカニズムが必要な場合は、バグを報告してください。
タイムライン
リリースされたバージョン: 2.3.0-17.0.pre.1
安定版リリース: 2.5
参考文献
API ドキュメント:
TestDefaultBinaryMessenger
TestDefaultBinaryMessengerBinding
関連する PR:
- PR #76288: ChannelBuffers.push に移行する